const express = require('express')
const router = express.Router()
var svgCaptcha = require('svg-captcha')

router.get('/api/captcha', (req, res) => {
  // 这里就已经生成了图片验证码和文本验证码了
  var captcha = svgCaptcha.create({
    size: 4,
    ignoreChars: 'iIl10oO',
    noise: 4,
    color: true
  })
  req.session.captcha = captcha.text.toLowerCase() //把验证码中的文本存放到session中,使用toLowerCase可以不用区分大小写。

  res.type('svg')
  res.status(200).send(captcha.data)
})

// 验证客户端发过来的验证码是否正确。当以为机器时，就会启动验证码
function validateCaptcha(req, res, next) {
  const reqCaptcha = req.body.captcha ? req.body.captcha.toLowerCase() : '' //用户传递的验证码
  if (reqCaptcha !== req.session.captcha) {
    res.send({
      code: 401,
      msg: '验证码错误'
    })
  } else {
    next()
  }

  req.session.captcha = ''
}

//  如果在一小段时间中请求达到了一定的数量，就可能是机器
function captchaHandler(req, res, next) {
  if (!req.session.records) {
    // 如果session中没有访问记录
    req.session.records = []
  }

  const now = new Date().getTime()
  req.session.records.push(now) // 把这一次请求的访问时间记录下来

  // 如果在一小段时间中请求达到了一定的数量，就可能是机器
  const duration = 10000
  const repeat = 10

  req.session.records = req.session.records.filter((time) => now - time <= duration)

  if (!('captcha' in req.body) && req.session.records.length >= repeat - 1) {
    // 需要输入验证码
    res.send({
      code: 401,
      msg: '请输入验证码'
    })
  }
  if (req.session.records.length >= repeat || 'captcha' in req.body) {
    // 验证验证码
    validateCaptcha(req, res, next)
  } else {
    next()
  }
}

// post，put请求就需要判断是不是机器在请求，机器请求的话就开启验证功能
router.post('/api/admin/login', captchaHandler)
router.post('*', captchaHandler)
router.put('*', captchaHandler)
// router.delete("*", captchaHandler);

module.exports = router
